package _08_blocking_queue;

import _04_queue.AbstractQueue;
import _04_queue.Queue;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * @author: mornd
 * @dateTime: 2023/6/9 - 16:50
 * 阻塞队列定义
 */

public interface BlockingQueue<E> extends Queue<E> {

    /**
     * 将指定的元素插入此队列，并在必要时等待可用空间。
     * @param e
     * @throws InterruptedException
     */
    void put(E e) throws InterruptedException;

    /**
     * 将指定的元素插入此队列，并在必要时等待可用空间，如果超出指定时间还是没有添加成功，则返回false
     * @param e
     * @param timeout
     * @param unit
     * @return
     * @throws InterruptedException
     */
    boolean offer(E e, long timeout, TimeUnit unit)
            throws InterruptedException;

    /**
     * 检索并删除此队列的头部，必要时等待，直到元素可用为止
     * @return
     * @throws InterruptedException 如果在等待时中断
     */
    E take() throws InterruptedException;

    E poll(long timeout, TimeUnit unit) throws InterruptedException;
}
